home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / traceroute.nasl < prev    next >
Text File  |  2005-01-14  |  5KB  |  224 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7. if(description)
  8. {
  9.  script_id(10287);
  10. # script_cve_id("CVE-MAP-NOMATCH");
  11.  script_version ("$Revision: 1.37 $");
  12.  name["english"] = "Traceroute";
  13.  name["francais"] = "Traceroute";
  14.  script_name(english:name["english"], francais:name["francais"]);
  15.  
  16.  desc["english"] = "Makes a traceroute to the remote host.
  17.  
  18. Risk factor : Low";
  19.  
  20.  desc["francais"] = "Fait un traceroute sur l'hote distant";
  21.  
  22.  script_description(english:desc["english"], francais:desc["francais"]);
  23.  
  24.  summary["english"] = "traceroute";
  25.  summary["francais"] = "traceroute";
  26.  script_summary(english:summary["english"], francais:summary["francais"]);
  27.  
  28.  script_category(ACT_GATHER_INFO);
  29.  
  30.  
  31.  script_copyright(english:"This script is Copyright (C) 1999 Renaud Deraison",
  32.         francais:"Ce script est Copyright (C) 1999 Renaud Deraison");
  33.  family["english"] = "Misc.";
  34.  family["francais"] = "Divers";
  35.  script_family(english:family["english"], francais:family["francais"]);
  36.  exit(0);
  37. }
  38.  
  39. #
  40. # The script code starts here
  41. #
  42.  
  43. dport = get_host_open_port();
  44. if(!dport)dport = 80;
  45.  
  46. ip_id = rand() % 65535;
  47.  
  48. my_sport = rand() % 64000 + 1024;
  49.  
  50. finished = 0;
  51. ttl = 1;
  52. src = this_host();
  53. dst = get_host_ip();
  54. error = 0;
  55.  
  56. str_ip = string(dst);
  57. z = strstr(str_ip, ".");
  58.  
  59. #
  60. # pcap filtter
  61. #
  62.  
  63. if(islocalhost())
  64. {
  65. # don't show route when no request was attempted
  66. #dub report = string("For your information, here is the traceroute to ", dst, " : \n", dst);
  67. #dub security_note(port:0, protocol:"udp", data:report);
  68.  exit(0);
  69. }
  70. report = string("For your information, here is the traceroute to ", dst, " : \n", this_host(), "\n");
  71. filter = string("dst host ", src, " and ((icmp and ((icmp[0]=3) or (icmp[0]=11)))" + 
  72.         " or (src host ", get_host_ip(), " and tcp and tcp[0:2]=", dport, " and tcp[2:2]=", my_sport, " and (tcp[13]=4 or tcp[13]=18)))");
  73.  
  74. #display(filter, "\n");
  75. d = get_host_ip();
  76. prev = string("");
  77.  
  78. #
  79. # the traceroute itself
  80. #
  81.  
  82. function filter(p)
  83. {
  84.  local_var ip, proto, id, hl, tcp, port;
  85.  
  86.  proto = get_ip_element(ip:p, element:"ip_p");
  87.  if(proto == IPPROTO_ICMP)
  88.  {
  89.   hl = get_ip_element(ip:p, element:"ip_hl");
  90.   ip = substr(p, hl * 4 + 8, hl * 4 + 8 + 20);
  91.   dst = get_ip_element(ip:ip, element:"ip_dst");
  92.   id  = get_ip_element(ip:ip, element:"ip_id");
  93.   if (id != ip_id ) { return 1; }
  94.     
  95.   if(dst == get_host_ip())return 0;
  96.   else return 1;
  97.  }
  98.  else if(proto == IPPROTO_TCP )
  99.  {
  100.   hl = get_ip_element(ip:p, element:"ip_hl");
  101.   tcp = substr(p, hl * 4, strlen(p));
  102.   port = ord(tcp[2])*256 + ord(tcp[3]);
  103.   if(port != my_sport )
  104.       {
  105.       return 1;
  106.     }
  107.   else return 0;
  108.  }
  109.  return 1;
  110. }
  111.  
  112.  
  113. function make_pkt(ttl, proto)
  114. {
  115.   #proto = proto % 5;
  116.   #display("make_pkt(", ttl, ", ", proto, ")\n");
  117.   src = this_host();
  118.   
  119.   
  120.    # Prefer TCP
  121.    if( proto == 0 || proto > 2)
  122.    {
  123.     ip = forge_ip_packet(ip_v : 4, ip_hl:5, ip_tos:0, ip_id:ip_id,
  124.             ip_len:20, ip_off:0, ip_p:IPPROTO_TCP, 
  125.             ip_src:src, ip_ttl:ttl);
  126.  
  127.     p = forge_tcp_packet(ip:ip, th_sport:my_sport, th_dport: dport, 
  128.             th_flags: TH_SYN, th_seq: ttl,
  129.             th_ack: 0, th_x2    : 0,th_off   : 5,
  130.             th_win   : 2048, th_urp   : 0);
  131.    
  132.    }
  133.    
  134.    
  135.   # then UDP
  136.   if (proto == 1)
  137.   {
  138.     ip = forge_ip_packet(ip_v : 4, ip_hl:5, ip_tos:0, ip_id:ip_id,
  139.             ip_len:28, ip_off:0, ip_p:IPPROTO_UDP, 
  140.             ip_src:src, ip_ttl:ttl);
  141.     p = forge_udp_packet(ip:ip, uh_sport:my_sport, uh_dport:32768, uh_ulen:8);
  142.     return (p);
  143.   }
  144.   # then ICMP
  145.   if (proto == 2)
  146.   {
  147.     ip = forge_ip_packet(ip_v : 4, ip_hl:5, ip_tos:0, ip_id:ip_id,
  148.             ip_len:20, ip_off:0, ip_p:IPPROTO_ICMP, 
  149.             ip_src:src, ip_ttl:ttl);
  150.     p = forge_icmp_packet(ip:ip, icmp_type:8, icmp_code:0,
  151.             icmp_seq: ttl, icmp_id:ttl);
  152.     return (p);
  153.   }
  154.  
  155.     return (p);
  156. }
  157.  
  158. proto=0;    # Prefer TCP
  159. while(!finished)
  160. {
  161.  
  162.  for (i=0; i < 3; i=i+1)
  163.  {
  164.   err=1;
  165.   p = make_pkt(ttl: ttl, proto: proto);
  166.   rep = send_packet(p, pcap_active:TRUE, pcap_filter:filter, pcap_timeout:1);
  167.   while(rep)
  168.   {
  169.    if(filter(p:rep) != 0 ) { 
  170.        #display("Again!\n");
  171.        rep = pcap_next(pcap_filter:filter, timeout:1);
  172.      }
  173.      else break;
  174.   }
  175.   
  176.   
  177.   if(rep)
  178.   {
  179.    psrc = get_ip_element(ip:rep, element:"ip_src");
  180.    #display("+", psrc, "\n");
  181.    report = report + string(psrc, "\n");    
  182.    d = psrc - d;
  183.    if(!d)finished = 1;
  184.    d = get_host_ip();
  185.    error = 0; err=0;
  186.    i=666;
  187.   }
  188.   else
  189.   {
  190.    proto++; 
  191.    if(proto >= 3)err = 1;
  192.    else err = 0;
  193.    proto%=3;
  194.   }
  195.  }
  196.  if(err)
  197.  {
  198.   #display("...\");
  199.   if (!error) report = report + string("?\n");
  200.   error = error+1;
  201.  }
  202.  ttl = ttl+1;
  203.  
  204.  #
  205.  # If we get more than 3 errors one after another, we stop
  206.  #
  207.  if(error > 3)finished = 1;
  208.  
  209.  #
  210.  # Should not get here
  211.  #
  212.  if(ttl > 50)finished = 1;
  213. }
  214.             
  215. #
  216. # show if at least one route was obtained.
  217. #
  218. # MA 2002-08-15: I split the expression "ttl=ttl-(1+error)" because of 
  219. # what looked like a NASL bug
  220. y = 1 + error;
  221. ttl = ttl - y;
  222. if (ttl > 0)
  223. security_note(port:0, protocol:"udp", data:report);
  224.